import microApp from '@micro-zoe/micro-app';
import { useCallback, useEffect, useRef, useState } from 'react';
import type {
  CommunicationCleanup,
  UseMicroAppOptions,
  UseMicroAppReturn,
} from '../types';

/**
 * useMicroApp Hook
 *
 * 功能特性：
 * - 管理微应用状态 (isLoaded, isError, isLoading)
 * - 提供应用操作 (reload, unmount)
 * - 提供数据操作 (setData, getData)
 * - 提供事件监听 (onDataChange)
 * - 处理生命周期事件
 * - 处理错误状态
 */
export function useMicroApp(options: UseMicroAppOptions): UseMicroAppReturn {
  const {
    name,
    // url, // 暂时注释掉未使用的变量
    autoMount = true,
    // onMounted, // 暂时注释掉未使用的变量
    onUnmounted,
    onError,
  } = options;

  // 状态管理
  const [isLoaded, setIsLoaded] = useState(false);
  const [isError, setIsError] = useState(false);
  const [isLoading, setIsLoading] = useState(autoMount);

  // 清理函数引用
  const cleanupRef = useRef<CommunicationCleanup[]>([]);

  // 生命周期事件处理
  // const handleMounted = useCallback(() => {
  //   console.log(`微应用 ${name} 已挂载`);
  //   setIsLoaded(true);
  //   setIsLoading(false);
  //   setIsError(false);

  //   if (onMounted) {
  //     onMounted();
  //   }
  // }, [name, onMounted]);

  const handleUnmounted = useCallback(() => {
    console.log(`微应用 ${name} 已卸载`);
    setIsLoaded(false);
    setIsLoading(false);

    if (onUnmounted) {
      onUnmounted();
    }
  }, [name, onUnmounted]);

  const handleError = useCallback(
    (error: Error) => {
      console.error(`微应用 ${name} 发生错误:`, error);
      setIsError(true);
      setIsLoading(false);
      setIsLoaded(false);

      if (onError) {
        onError(error);
      }
    },
    [name, onError],
  );

  // 重新加载应用
  const reload = useCallback(() => {
    console.log(`重新加载微应用: ${name}`);

    try {
      setIsLoading(true);
      setIsError(false);
      microApp.reload(name, true);
    } catch (error) {
      console.error(`重新加载微应用 ${name} 失败:`, error);
      handleError(error as Error);
    }
  }, [name, handleError]);

  // 卸载应用
  const unmount = useCallback(() => {
    console.log(`卸载微应用: ${name}`);

    try {
      // 清理所有监听器
      cleanupRef.current.forEach((cleanup) => cleanup());
      cleanupRef.current = [];

      // 卸载应用
      microApp.unmountApp?.(name, { destroy: false });
      handleUnmounted();
    } catch (error) {
      console.error(`卸载微应用 ${name} 失败:`, error);
      handleError(error as Error);
    }
  }, [name, handleUnmounted, handleError]);

  // 设置数据
  const setData = useCallback(
    (data: any) => {
      try {
        console.log(`设置微应用 ${name} 数据:`, data);
        microApp.setData(name, data);
      } catch (error) {
        console.error(`设置微应用 ${name} 数据失败:`, error);
        handleError(error as Error);
      }
    },
    [name, handleError],
  );

  // 获取数据
  const getData = useCallback(() => {
    try {
      const data = microApp.getData(name);
      console.log(`获取微应用 ${name} 数据:`, data);
      return data;
    } catch (error) {
      console.error(`获取微应用 ${name} 数据失败:`, error);
      handleError(error as Error);
      return null;
    }
  }, [name, handleError]);

  // 监听数据变化
  const onDataChange = useCallback(
    (callback: (data: any) => void): CommunicationCleanup => {
      try {
        console.log(`开始监听微应用 ${name} 数据变化`);

        const listener = (data: any) => {
          console.log(`微应用 ${name} 数据发生变化:`, data);
          callback(data);
        };

        microApp.addDataListener(name, listener);

        const cleanup = () => {
          console.log(`停止监听微应用 ${name} 数据变化`);
          microApp.removeDataListener(name, listener);
        };

        // 保存清理函数
        cleanupRef.current.push(cleanup);

        return cleanup;
      } catch (error) {
        console.error(`监听微应用 ${name} 数据变化失败:`, error);
        handleError(error as Error);
        return () => {};
      }
    },
    [name, handleError],
  );

  // 初始化时设置事件监听
  useEffect(() => {
    if (!autoMount) return;

    console.log(`初始化微应用 ${name} 状态监听`);

    // 这里可以添加对微应用状态的监听
    // 由于 micro-app 的生命周期事件通常在组件级别处理
    // 这里主要是设置初始状态

    return () => {
      // 组件卸载时清理所有监听器
      cleanupRef.current.forEach((cleanup) => cleanup());
      cleanupRef.current = [];
    };
  }, [name, autoMount]);

  return {
    // 应用状态
    isLoaded,
    isError,
    isLoading,

    // 应用操作
    reload,
    unmount,

    // 数据操作
    setData,
    getData,

    // 事件监听
    onDataChange,
  };
}
